﻿#region Header
//
//   Project:           PicFx - Windows Phone 7 image effects app.
//
//   Changed by:        $Author$
//   Changed on:        $Date$
//   Changed in:        $Revision$
//   Project:           $URL$
//   Id:                $Id$
//
//
//   Copyright (c) 2010 Rene Schulte
//
//   This program is open source software. Please read the License.txt.
//
#endregion

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;

namespace PicFx
{
   public partial class App : Application
   {
      /// <summary>
      /// Provides easy access to the root frame of the Phone Application.
      /// </summary>
      /// <returns>The root frame of the Phone Application.</returns>
      public PhoneApplicationFrame RootFrame { get; private set; }

      /// <summary>
      /// Constructor for the Application object.
      /// </summary>
      public App()
      {
         // Global handler for uncaught exceptions. 
         UnhandledException += Application_UnhandledException;

         // Show graphics profiling information while debugging.
         if (System.Diagnostics.Debugger.IsAttached)
         {
            // Display the current frame rate counters.
            Current.Host.Settings.EnableFrameRateCounter = true;

            // Show the areas of the app that are being redrawn in each frame.
            //Application.Current.Host.Settings.EnableRedrawRegions = true;

            // Enable non-production analysis visualization mode, 
            // which shows areas of a page that are being GPU accelerated with a colored overlay.
            //Application.Current.Host.Settings.EnableCacheVisualization = true;
         }

         // Standard Silverlight initialization
         InitializeComponent();

         // Phone-specific initialization
         InitializePhoneApplication();
      }

      // Code to execute when the application is launching (eg, from Start)
      // This code will not execute when the application is reactivated
      private void Application_Launching(object sender, LaunchingEventArgs e)
      {
      }

      // Code to execute when the application is activated (brought to foreground)
      // This code will not execute when the application is first launched
      private void Application_Activated(object sender, ActivatedEventArgs e)
      {
      }

      // Code to execute when the application is deactivated (sent to background)
      // This code will not execute when the application is closing
      private void Application_Deactivated(object sender, DeactivatedEventArgs e)
      {
      }

      // Code to execute when the application is closing (eg, user hit Back)
      // This code will not execute when the application is deactivated
      private void Application_Closing(object sender, ClosingEventArgs e)
      {
      }

      // Code to execute if a navigation fails
      void RootFrame_NavigationFailed(object sender, NavigationFailedEventArgs e)
      {
         if (System.Diagnostics.Debugger.IsAttached)
         {
            // A navigation has failed; break into the debugger
            System.Diagnostics.Debugger.Break();
         }
      }

      // Code to execute on Unhandled Exceptions
      private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
      {
         if (System.Diagnostics.Debugger.IsAttached)
         {
            // An unhandled exception has occurred; break into the debugger
            System.Diagnostics.Debugger.Break();
         }
      }

      #region Phone application initialization

      // Avoid double-initialization
      private bool phoneApplicationInitialized = false;

      // Do not add any additional code to this method
      private void InitializePhoneApplication()
      {
         if (phoneApplicationInitialized)
            return;

         // Create the frame but don't set it as RootVisual yet; this allows the splash
         // screen to remain active until the application is ready to render.
         RootFrame = new PhoneApplicationFrame();
         RootFrame.Navigated += CompleteInitializePhoneApplication;

         // Handle navigation failures
         RootFrame.NavigationFailed += RootFrame_NavigationFailed;

         // Ensure we don't initialize again
         phoneApplicationInitialized = true;
      }

      // Do not add any additional code to this method
      private void CompleteInitializePhoneApplication(object sender, NavigationEventArgs e)
      {
         // Set the root visual to allow the application to render
         if (RootVisual != RootFrame)
            RootVisual = RootFrame;

         // Remove this handler since it is no longer needed
         RootFrame.Navigated -= CompleteInitializePhoneApplication;
      }

      #endregion
   }
}